<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>1_类的基本知识</title>
</head>

<body>
    <script type="text/javascript">
        /**
         *  1.类中的构造器不是必须写的,要对实例进行一些初始化的操作,如添加指定属性时才写
         *  2.如果A类继承了B类,且A类中写了构造器,那么A类构造器中的super是必须要调用的
         */
        class Person {
            // 构造方法
            constructor(name, age) {
                // 构造器钟的this是谁? - 类的实例对象
                this.name = name
                this.age = age
            }
            // 一般方法
            speak(){
                // speak方法放在了哪里?  -- 类的原型对象上,供实例使用
                // 通过person实例调用speak时,speak中的this就是Person实例
                console.log(`我叫${this.name}, 我年龄是${this.age}`)
            }
        }

        class Student extends Person{
            constructor(name, age, grade){
                super(name, age)
                this.grade = grade
            }
            speak(){
                // speak方法放在了哪里?  -- 类的原型对象上,供实例使用
                // 通过Student实例调用speak时,speak中的this就是Student实例
                console.log(`我叫${this.name}, 我年龄是${this.age}, 我读的是${this.grade}`)
            }
        }
        
        // 创建一个Person的实例对象
        const p1 = new Person('tom', 18)
        const p2 = new Person('jerry', 19)
        p1.speak()
        p1.speak.call({a:1,b:2})  // 获取的是undefined

        console.log(p1)
        console.log(p2)

        const s1 = new Student('小张', 15, '高一')
        console.log(s1)
        s1.speak()


        
    </script>
</body>

</html>